home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / gfx / misc / cutitout.lha / cut2.c < prev    next >
C/C++ Source or Header  |  1993-01-04  |  6KB  |  284 lines

  1. #include <dos/dos.h>
  2. #include <exec/memory.h>
  3. #include <custom/iff.h>
  4. #include <float.h>
  5. #include <graphics/scale.h>
  6. #include <exec/libraries.h>
  7. #include <libraries/asl.h>
  8. #include <clib/asl_protos.h>
  9. #include <stdio.h>
  10. #include "cutitoutwin.c"
  11.  
  12. struct BitMap mybitmap;    
  13. struct IFFL_BMHD *bmhd;
  14. WORD kleur[256];
  15. int bitgood = FALSE;
  16. struct Library *IFFBase=NULL, *AslBase=NULL;
  17.  
  18. struct TagItem frtags[] = 
  19.     { TAG_DONE };
  20. struct FileRequester *fr=NULL;
  21.  
  22. wbmain()
  23.    {
  24.    main();
  25.    }
  26.  
  27. main()
  28.    {
  29.    if(!openlibs()) die("Sorry, some library missing...");
  30.    if(SetupScreen()!=0) die("Sorry, couldn't open screen...");
  31.    if(OpenCutBitmapWindow()!=0) die("Sorry, couldn't open window...");
  32.    HandleCutBitmapIDCMP();
  33.    die("That's all folks!");
  34.    }
  35.  
  36. die(txt)
  37. unsigned char *txt;
  38.    {
  39.    printf("%s\n\n",txt);
  40.    CloseCutBitmapWindow();
  41.    CloseDownScreen();
  42.    if(bitgood) MyFreeBitMap(&mybitmap);
  43.    closelibs();
  44.    exit(0);
  45.    }
  46.  
  47. viewClicked()
  48.    { return(TRUE); }
  49.  
  50. loadClicked()
  51.    { 
  52.     IFFL_HANDLE iff;
  53.     long planesize,i;
  54.     UBYTE file[256];
  55.     static struct TagItem frt1[] = 
  56.         { ASL_Hail, (ULONG)"Cut-it-out! Load IFF",TAG_DONE };
  57.  
  58.     if(bitgood)    MyFreeBitMap(&mybitmap);
  59.  
  60.     if(AslRequest(fr,frt1)==NULL)
  61.         return(FALSE);
  62.     strcpy(file,fr->rf_Dir);
  63.     AddPart(file,fr->rf_File,255);
  64.  
  65.     if(iff = IFFL_OpenIFF(file, IFFL_MODE_READ) )
  66.          {    if(bmhd = IFFL_GetBMHD(iff) )
  67.               { IFFL_GetViewModes(iff);
  68.                 IFFL_GetColorTab(iff,kleur);
  69.                 InitBitMap(&mybitmap,bmhd->nPlanes,bmhd->w,bmhd->h);
  70.                 planesize=mybitmap.BytesPerRow*mybitmap.Rows;
  71.  
  72.                 for(i=0; i<bmhd->nPlanes; ++i)
  73.                 if(!(mybitmap.Planes[i]=AllocMem(planesize,MEMF_CLEAR)))
  74.                     { MyFreeBitMap(&mybitmap); 
  75.                       IFFL_CloseIFF(iff);
  76.                       die("Sorry, no memory for picture-storage...");
  77.                     }
  78.  
  79.                 bitgood=TRUE;
  80.                 IFFL_DecodePic(iff, &mybitmap);
  81.                 refreshit();
  82.                 }
  83.             IFFL_CloseIFF(iff);
  84.          }
  85.     return(TRUE);
  86.    }
  87.  
  88. refreshit()
  89.    {
  90.    struct BitMap *dbm;
  91.    struct BitScaleArgs bms;
  92.  
  93.    if(!bitgood) return(FALSE);
  94.  
  95.    dbm=CutBitmapWnd->RPort->BitMap;
  96.                 
  97.    bms.bsa_SrcX=0L;
  98.    bms.bsa_SrcY=0L;
  99.    bms.bsa_SrcWidth=bmhd->w;
  100.     bms.bsa_SrcHeight=bmhd->h;
  101.     bms.bsa_XSrcFactor=bmhd->w;
  102.     bms.bsa_YSrcFactor=bmhd->h;
  103.     bms.bsa_DestX=leftbevel();
  104.     bms.bsa_DestY=topbevel();
  105.     bms.bsa_DestWidth=bevelwidth();
  106.     bms.bsa_DestHeight=bevelheight();
  107.     bms.bsa_XDestFactor=bms.bsa_DestWidth;
  108.     bms.bsa_YDestFactor=bms.bsa_DestHeight;
  109.     bms.bsa_SrcBitMap=&mybitmap;
  110.     bms.bsa_DestBitMap=dbm;
  111.     bms.bsa_Flags=0;
  112.     BitMapScale(&bms);
  113.    }
  114.  
  115. leftbevinwin()
  116.    { return(OffX+ComputeX(10+4));
  117.    }
  118.  
  119. leftbevel()
  120.    { return(CutBitmapWnd->LeftEdge+OffX+ComputeX(10+4));
  121.    }
  122.  
  123. topbevinwin()
  124.    { return(OffY+ComputeY(5+2));
  125.    }
  126.  
  127. topbevel()
  128.    { return(CutBitmapWnd->TopEdge+OffY+ComputeY(5+2));
  129.    }
  130.  
  131. rightbevinwin()
  132.    { return(leftbevinwin()+bevelwidth());
  133.    }
  134.  
  135. rightbevel()
  136.    { return(leftbevel()+bevelwidth());
  137.    }
  138.  
  139. bottombevinwin()
  140.    { return(topbevinwin()+bevelheight());
  141.    }
  142.  
  143. bottombevel()
  144.    { return(topbevel()+bevelheight());
  145.    }
  146.  
  147. bevelwidth()
  148.    { return(ComputeX(CutBitmapWidth-20)-2*OffX-3-8);
  149.    }
  150.  
  151. bevelheight()
  152.    { return(ComputeY(CutBitmapHeight-10)-2*OffY-4);
  153.    }
  154.  
  155. saveClicked(zoomx,zoomy)
  156. int *zoomx,*zoomy;
  157.     {  
  158.     float scalew,scaleh;
  159.     int result;
  160.     static struct EasyStruct es1 = 
  161.             { sizeof(struct EasyStruct),
  162.               0,
  163.               "Information",
  164.               "IFF file stored succesfully.\nGood luck!",
  165.               "Ok"
  166.             };
  167.     static struct EasyStruct es2 = 
  168.             { sizeof(struct EasyStruct),
  169.               0,
  170.               "Information",
  171.               "I'm sorry, something went\ncompletely wrong there...",
  172.               "Ok"
  173.             };
  174.     UBYTE file[256];
  175.     static struct TagItem frt2[] = 
  176.         { ASL_Hail,(ULONG)"Cut-it-out! Load IFF",
  177.          ASL_FuncFlags, FILF_SAVE, 
  178.           TAG_DONE
  179.         };
  180.  
  181.     if(AslRequest(fr,frt2)==NULL)
  182.         return(FALSE);
  183.  
  184.     strcpy(file,fr->rf_Dir);
  185.     AddPart(file,fr->rf_File,255);
  186.     
  187.     scalew=((float)bmhd->w)/bevelwidth();
  188.     scaleh=((float)bmhd->h)/bevelheight();
  189.  
  190.     if((result=IFFL_SaveClip(file,&mybitmap,
  191.                 kleur,1,
  192.                   (long)((zoomx[0]-leftbevinwin())*scalew/8.0),
  193.                   (long)((zoomy[0]-topbevinwin())*scaleh),
  194.                 (long)((zoomx[1]-zoomx[0])*scalew/8.0),
  195.                 (long)((zoomy[1]-zoomy[0])*scaleh)))==0)
  196.             { EasyRequest(CutBitmapWnd,&es2,NULL,NULL); }
  197.     else    { EasyRequest(CutBitmapWnd,&es1,NULL,NULL); }
  198.  
  199.     return(TRUE);
  200.     }
  201.  
  202. expandClicked()
  203.    { return(TRUE); }
  204.  
  205. showfullClicked()
  206.    { return(TRUE); }
  207.  
  208. openlibs()
  209.    {
  210.    if(IFFBase = OpenLibrary(IFFNAME, IFFVERSION) )
  211.         if(AslBase = OpenLibrary("asl.library",37L))
  212.                if(fr=(struct FileRequester *)AllocAslRequest(ASL_FileRequest,frtags))
  213.                        return(TRUE);
  214.         
  215.    return(FALSE);
  216.    }
  217.  
  218. closelibs()
  219.    {
  220.     if(fr)         FreeAslRequest(fr);
  221.    if(IFFBase) CloseLibrary(IFFBase);    
  222.    if(AslBase) CloseLibrary(AslBase);
  223.    }
  224.  
  225. MyFreeBitMap(bm)
  226. struct BitMap *bm;
  227.   {
  228.    LONG planesize=bm->BytesPerRow*bm->Rows,i;
  229.  
  230.    for(i=0; i<bm->Depth; ++i)
  231.     if(bm->Planes[i])
  232.         { FreeMem(bm->Planes[i],planesize);
  233.           bm->Planes[i]=0;
  234.         }
  235.     bitgood=FALSE;
  236.   }
  237.  
  238. drawcross(eraseold,drawnew,x,y)
  239. BOOL eraseold,drawnew;
  240. int x,y;
  241.     {
  242.     static oldx,oldy;
  243.  
  244.     if(eraseold)
  245.         { Move(CutBitmapWnd->RPort,leftbevinwin(),oldy);
  246.           Draw(CutBitmapWnd->RPort,rightbevinwin(),oldy);
  247.           Move(CutBitmapWnd->RPort,oldx,topbevinwin());
  248.           Draw(CutBitmapWnd->RPort,oldx,bottombevinwin());
  249.         }
  250.     if(drawnew)
  251.         { Move(CutBitmapWnd->RPort,leftbevinwin(),y);
  252.           Draw(CutBitmapWnd->RPort,rightbevinwin(),y);
  253.           Move(CutBitmapWnd->RPort,x,topbevinwin());
  254.           Draw(CutBitmapWnd->RPort,x,bottombevinwin());
  255.         }
  256.     oldx=x;
  257.     oldy=y;
  258.     }
  259.  
  260. drawrubber(eraseold,drawnew,x,y,zoomx,zoomy)
  261. BOOL eraseold,drawnew;
  262. int x,y,*zoomx,*zoomy;
  263.     {
  264.     static oldx,oldy;
  265.  
  266.     if(eraseold)
  267.         { Move(CutBitmapWnd->RPort,zoomx[0],zoomy[0]);
  268.           Draw(CutBitmapWnd->RPort,zoomx[0],oldy);
  269.           Draw(CutBitmapWnd->RPort,oldx,oldy);
  270.           Draw(CutBitmapWnd->RPort,oldx,zoomy[0]);
  271.           Draw(CutBitmapWnd->RPort,zoomx[0],zoomy[0]);
  272.         }
  273.     if(drawnew)
  274.         { Move(CutBitmapWnd->RPort,zoomx[0],zoomy[0]);
  275.           Draw(CutBitmapWnd->RPort,zoomx[0],y);
  276.           Draw(CutBitmapWnd->RPort,x,y);
  277.           Draw(CutBitmapWnd->RPort,x,zoomy[0]);
  278.           Draw(CutBitmapWnd->RPort,zoomx[0],zoomy[0]);
  279.         }
  280.     oldx=x;
  281.     oldy=y;
  282.     }
  283.  
  284.